package net.form.processing;

import java.awt.Color;

public class HoleFinder extends AbstractImageCommand {
	

	private static int blanco = (new Color(255, 255, 255)).getRGB();

	private static int negro = (new Color(0, 0, 0)).getRGB();
	
	private static int gris = (new Color(128, 128,128)).getRGB();
	
	
	public HoleFinder(Image image) {
		super(image);
	}
	
	public Image execute() {
		if (getImage() != null) {
			return  algorithmHoleFinder(getImage());
		}
		return null;
	}

	private Image algorithmHoleFinder(Image image) {
		Image background = new Image(image.getWidth(),
				image.getHeight());
		background.setData(image.getData());
	    for (int y = 0; y < image.getHeight(); y++)
	    {
	        boolean border = false;
	        for (int x = 0; x < image.getWidth() && !border; x++)
	            if (image.getRGB(x,y) == negro)
	                background.setRGB(x, y, gris);
	            else
	                border = true;
	    }

		    for (int x = 0; x < image.getWidth(); x++)
		    {
		        boolean border = false;
		        for (int y = 0; y < image.getHeight() && !border; y++)
		            if (image.getRGB(x,y) == negro)
		                background.setRGB(x, y, gris);
		            else
		                border = true;
		    }

		    for (int y = image.getHeight()-1; y >= 0 ; y--)
		    {
		        boolean border = false;
		        for (int x = image.getWidth()-1; x >= 0  && !border; x--)
		            if (image.getRGB(x,y) == negro)
		                background.setRGB(x, y, gris);
		            else
		                border = true;
		    }

		    for (int x = image.getWidth()-1; x >= 0; x--)
		    {
		        boolean border = false;
		        for (int y = image.getHeight()-1; y >= 0  && !border; y--)
		            if (image.getRGB(x,y) == negro)
		                background.setRGB(x, y, gris);
		            else
		                border = true;
		    }

		    // refinado...

		    for (int y = 0; y < image.getHeight()-1; y++)
		    {
		        for (int x = 0; x < image.getWidth()-1; x++)
		            if (background.getRGB(x,y) == gris)
		            {
		                if (background.getRGB(x-1,y) == negro) background.setRGB(x-1,y,gris);
		                if (background.getRGB(x,y-1) == negro) background.setRGB(x,y-1,gris);
		                if (background.getRGB(x+1,y) == negro) background.setRGB(x+1,y,gris);
		                if (background.getRGB(x,y+1) == negro) background.setRGB(x,y+1,gris);
		            }
		    }

		    for (int y = image.getHeight()-1; y > 0 ; y--)
		    {
		        for (int x = image.getWidth()-1; x > 0; x--)
		            if (background.getRGB(x,y) == gris)
		            {
		                if (background.getRGB(x-1,y) == negro) background.setRGB(x-1,y,gris);
		                if (background.getRGB(x,y-1) == negro) background.setRGB(x,y-1,gris);
		                if (background.getRGB(x+1,y) == negro) background.setRGB(x+1,y,gris);
		                if (background.getRGB(x,y+1) == negro) background.setRGB(x,y+1,gris);
		            }
		    }

		    for (int y = 0; y < image.getHeight()-1; y++)
		    {
		        for (int x = image.getWidth()-1; x > 0; x--)
		            if (background.getRGB(x,y) == gris)
		            {
		                if (background.getRGB(x-1,y) == negro) background.setRGB(x-1,y,gris);
		                if (background.getRGB(x,y-1) == negro) background.setRGB(x,y-1,gris);
		                if (background.getRGB(x+1,y) == negro) background.setRGB(x+1,y,gris);
		                if (background.getRGB(x,y+1) == negro) background.setRGB(x,y+1,gris);
		            }
		    }

		    for (int y = image.getHeight()-1; y > 0 ; y--)
		    {
		        for (int x = 0; x < image.getWidth()-1; x++)
		            if (background.getRGB(x,y) == gris)
		            {
		                if (background.getRGB(x-1,y) == negro) background.setRGB(x-1,y,gris);
		                if (background.getRGB(x,y-1) == negro) background.setRGB(x,y-1,gris);
		                if (background.getRGB(x+1,y) == negro) background.setRGB(x+1,y,gris);
		                if (background.getRGB(x,y+1) == negro) background.setRGB(x,y+1,gris);
		            }
		    }

		    for (int x = 0; x < image.getWidth(); x++)
		        for (int y = 0; y < image.getHeight(); y++)
		            if (background.getRGB(x,y) == gris)
		                background.setRGB(x,y,negro);
		            else
		                background.setRGB(x,y,blanco);

		    return background;
		
	}
	
	
	@Override
	public String getCommandName() {
		return "Relleno De Huecos";
	}

}
